package com.twj.tools.parse;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationConfig.Feature;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.ser.StdSerializerProvider;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author 商健
 * @version 1.0
 * @project 大数据云平台局项目
 * @package com.css.sssjcx.common.util
 * @file JsonUtils.java 创建时间:2016年11月14日上午10:35:31
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2016 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 模块名称
 * @reviewer 审核人
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 */
public class JsonUtils {

    /**
     * @description 字段功能描述
     * @value value:log
     */

    /**
     * @description 字段功能描述
     * @value value:mapper
     */
    private static ObjectMapper mapper = new ObjectMapper();

    {
        mapper.configure(org.codehaus.jackson.JsonGenerator.Feature.QUOTE_FIELD_NAMES, true);
        mapper.configure(org.codehaus.jackson.map.SerializationConfig.Feature.CAN_OVERRIDE_ACCESS_MODIFIERS, true);
        //mapper.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false);
        mapper.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, true);
        final StdSerializerProvider serial = new StdSerializerProvider();
        serial.setNullValueSerializer(new NullValueJsonSerializer());
        mapper.setSerializerProvider(serial);
        mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(org.codehaus.jackson.JsonParser.Feature.ALLOW_COMMENTS, true);
        mapper.configure(org.codehaus.jackson.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
        mapper.configure(org.codehaus.jackson.JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
        //mapper.configure(org.codehaus.jackson.JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
        mapper.configure(org.codehaus.jackson.JsonParser.Feature.INTERN_FIELD_NAMES, true);
        //mapper.configure(org.codehaus.jackson.JsonParser.Feature.CANONICALIZE_FIELD_NAMES, true);
        mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    /**
     * @param jsonStr jsonStr
     * @param obj     obj
     * @param <T>     obj
     * @return map
     * @name json转str2Object
     * @description 相关说明
     * @time 创建时间:2016年11月14日上午10:35:45
     * @author 商健
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public static <T> T str2Object(String jsonStr, Class<? extends T> obj) {
        try {
            //mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);  
            return mapper.readValue(jsonStr, obj);//new TypeReference<Service>() {  }
        } catch (Exception e) {
//            log.error(e);
        }
        return null;
    }

    /**
     * @param jsonStr jsonStr
     * @return map
     * @name json转map
     * @description 相关说明
     * @time 创建时间:2016年11月14日上午10:35:45
     * @author 商健
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    @SuppressWarnings("rawtypes")
    public static Map str2Map(String jsonStr) {
        Map map = null;
        try {
            map = mapper.readValue(jsonStr, Map.class);
        } catch (Exception e) {
            //log.error(e);
        }
        return map;
    }

    /**
     * @param jsonStr jsonStr
     * @return list
     * @name json 转list
     * @description 相关说明
     * @time 创建时间:2016年11月14日上午10:35:00
     * @author 商健
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    @SuppressWarnings("rawtypes")
    public static List str2List(String jsonStr) {
        List list = null;
        try {
            list = mapper.readValue(jsonStr, List.class);
        } catch (Exception e) {
            //log.error(e);
        }
        return list;
    }

    /**
     * @param obj obj
     * @return json
     * @name 对象转json
     * @description 相关说明
     * @time 创建时间:2016年11月14日上午10:35:56
     * @author 商健
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public static String obj2Json(Object obj) {
        String jsonStr = null;
        try {
            jsonStr = mapper.writeValueAsString(obj);
        } catch (Exception e) {
//            log.error(e);
        }
        return jsonStr;
    }

    class NullValueJsonSerializer extends JsonSerializer<Object> {

        /**
         * @param arg0 Object
         * @param arg1 JsonGenerator
         * @param arg2 SerializerProvider
         * @throws IOException
         * @throws JsonProcessingException
         * @name 中文名称
         * @description 相关说明
         * @time 创建时间:2018-4-18上午10:32:32
         * @author zhanghuo
         * @history 修订历史（历次修订内容、修订人、修订时间等）
         */
        @Override
        public void serialize(Object arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException {
            arg1.writeString("");
        }

    }

}
